package be.ipl.pigolo.servlets;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import be.ipl.pigolo.domaine.Cochon;
import be.ipl.pigolo.domaine.Fermier;
import be.ipl.pigolo.domaine.Partie;
import be.ipl.pigolo.domaine.Partie.Etat;
import be.ipl.pigolo.domaine.PartieFermier;
import be.ipl.pigolo.usecases.GestionPartie;
import be.ipl.pigolo.util.Util;

/**
 * Servlet implementation class Jeu
 * 
 * @author lspitaels,sdoublier
 */
@WebServlet(name = "jouer.html")
public class Jouer extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@EJB
	GestionPartie gestPartie;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		HttpSession session = request.getSession();
		String username = "";
		GestionPartie gestPartie = null;
		String nomPartie = (String) request.getParameter("nomPartie");

		synchronized (session) {
			username = (String) session.getAttribute("fermier");
			gestPartie = (GestionPartie) session.getAttribute("gestionpartie");
			if (nomPartie == null)
				nomPartie = (String) session.getAttribute("nomPartie");
			else
				session.setAttribute("nomPartie", nomPartie);
		}

		if (Util.checkNullEmpty(username)) {
			String erreurSession = "Merci de vous connecter au préalable.";
			response.sendRedirect(response
					.encodeRedirectURL("accueil.html?erreurSession="
							+ erreurSession));
		} else {
			if (gestPartie.getEtat(nomPartie) == Etat.ANNULEE.name()) {
				response.sendRedirect(response
						.encodeRedirectURL("listedesparties.html?message="
								+ "Partie annulée"));
			} else if (gestPartie.getEtat(nomPartie) == Etat.INTERROMPUE.name()) {
				response.sendRedirect(response
						.encodeRedirectURL("listedesparties.html?message="
								+ "Partie interrompue"));
			} else {
				Partie partie = gestPartie.rechercherPartie(nomPartie);

				if (partie.getEtat() == Partie.Etat.TERMINEE) {
					if (partie.getVainqueur() == null)
						response.sendRedirect(response
								.encodeRedirectURL("listedesparties.html?message="
										+ "Partie terminée, il n'y a pas de vainqueur..."));
					else
						response.sendRedirect(response
								.encodeRedirectURL("listedesparties.html?message="
										+ "Partie terminée, le vainqueur est : "
										+ partie.getVainqueur().getNom()));
				} else {
					String journal = gestPartie.journal(nomPartie);
					List<PartieFermier> listePartieFermier = gestPartie
							.listerLesParticipants(nomPartie);
					List<Fermier> listeDeFermier = new ArrayList<Fermier>();
					List<String> listeStringParticipants = new ArrayList<String>();
					for (PartieFermier pf : listePartieFermier) {
						listeDeFermier.add(pf.getFermier());
						listeStringParticipants.add(""
								+ pf.getFermier().getNom() + " "
								+ pf.getPurins());
					}

					List<Cochon> cochons = new ArrayList<Cochon>();
					Cochon[][] tabCochon = partie.getTableauDesCochons();
					if (tabCochon != null) {
						for (int i = 0; i < tabCochon.length; i++) {
							for (int j = 0; j < tabCochon[i].length; j++) {
								cochons.add(tabCochon[i][j]);
							}
						}
						request.setAttribute("tailleListeCochons",
								tabCochon.length);
					}

					request.setAttribute("listeDesDes", partie.getDeValeurs());
					request.setAttribute("desOrdre", partie.getDeOrdre());
					request.setAttribute("journal", journal);
					request.setAttribute("listeCochons", cochons);
					request.setAttribute("nomPartie", nomPartie);
					request.setAttribute("listeDeFermiers", listeDeFermier);
					request.setAttribute("listeStringParticipants",
							listeStringParticipants);
					request.setAttribute("partie", partie);
					getServletContext().getNamedDispatcher("jeu.html").forward(
							request, response);
				}
			}
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		String username = "";
		GestionPartie gestPartie = null;
		String nomPartie = "";

		synchronized (session) {
			username = (String) session.getAttribute("fermier");
			gestPartie = (GestionPartie) session.getAttribute("gestionpartie");
			nomPartie = (String) session.getAttribute("nomPartie");
		}

		if (Util.checkNullEmpty(username)) {
			session.setAttribute("erreurSession",
					"Merci de vous connecter au préalable.");
			response.sendRedirect(response.encodeRedirectURL("accueil.html"));
		} else {
			int idCochon = Integer.parseInt(request.getParameter("cochonId")
					.toString());
			gestPartie.prendreCochon(idCochon, nomPartie, username);
			doGet(request, response);
		}
	}
}
